#include <iostream>
#include <random>
#include <iomanip>
#include <sstream>
#include <atomic>
class UUIDHelper
{
public:
    static std::string uuid()
    {
        std::random_device rd;
        std::mt19937_64 gernator(rd());
        // 生成的随机数要在0-255中间
        std::uniform_int_distribution<int> distribution(0, 255);
        std::stringstream ss;
        for (int i = 0; i < 8; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
            if (i == 3 || i == 5 || i == 7)
            {
                ss << "-";
            }
        }
        static std::atomic<size_t> seq(1); // 定义一个原子类型整数，初始化为1
        size_t num = seq.fetch_add(1);     //+1,size_t 无符号长整形，刚好8字节
        for (int i = 7; i >= 0; i--)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i * 8) & 0xff);
            if (i == 6)
                ss << "-";
        }
        return ss.str();
    }
};
int main()
{
    // std::random_device rd;
    // // size_t num = rd(); // 生成一个机器随机数,效率非常慢
    // //  通过一个机器随机数作为一个种子，作为伪随机数的种子
    // std::mt19937_64 gernator(rd()); // 梅森旋转算法，生成一个伪随机数

    // // 生成的随机数要在0-255中间
    // std::uniform_int_distribution<int> distribution(0, 255);
    // // std::cout << distribution(gernator) << std::endl;

    // // 转换为16进制
    // std::stringstream ss;
    // for (int i = 0; i < 8; i++)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
    //     if (i == 3 || i == 5 || i == 7)
    //     {
    //         ss << "-";
    //     }
    // }
    // static std::atomic<size_t> seq(1); // 定义一个原子类型整数，初始化为1
    // size_t num = seq.fetch_add(1);     //+1,size_t 无符号长整形，刚好8字节
    // for (int i = 7; i >= 0; i--)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> i * 8) & 0xff);
    //     if (i == 6)
    //         ss << "-";
    // }
    // std::cout << ss.str() << std::endl;

    for (int i = 0; i < 20; i++)
    {
        std::cout << UUIDHelper::uuid() << std::endl;
    }
    return 0;
}